# 导入pandas用户数据分析
import pandas as pd
# 从sklearn.cross_validation导入train_test_split进行数据分割
from sklearn.cross_validation import train_test_split
# 从sklearn.feature_extraction导入特征转换器DictVectorizer
from sklearn.feature_extraction import DictVectorizer
# 从sklearn.tree中导入决策树分类器
from sklearn.tree import DecisionTreeClassifier

from sklearn.metrics import classification_report

# 可以从网络下载泰坦尼克号乘客数据
# http://biostat.mc.vanderbilt.edu/wiki/pub/Main/DataSets/titanic.txt
titanic = pd.read_csv('PythonMachineLearningAndPractice/data/section02/05Titanic/titanic.txt')

# 观察前几行数据，可以发现，数据种类各类，数值型。类别型，甚至还有确实数据
# print(titanic.head())

# 1）选择特征Feature、目标值
X = titanic[['pclass', 'age', 'sex']]
y = titanic['survived']

# 2）对当前选择的特征进行探查
# 使用pandas，数据都传入pandas独有的dataframe格式(二维数据表格)，直接使用info()查看数据的统计特征
print(X.info())

# 2.1)age这个数据列只有633个，需要补充完
# 2.2）sex与pclass两个数据列的值都是类别型的，需要转换为数值特征，用0/1代替
# 补充age里的数据，使用平均数或者中位数都是对模型偏离造成最小影响的策略
X['age'].fillna(X['age'].mean(), inplace=True)
# print(X.info())

# 将训练集和测试集随机分割，并将25%作为测试集，75%作为训练集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.25, random_state=33)

# 使用scikit-learn feature_extraction中的特征转换器，进行特征抽取
vec = DictVectorizer(sparse=False)
# 转换特征后，我们发现凡是类别型的特征都是单独剥离出来，独成一列特征，数值型的则保持不变
X_train = vec.fit_transform(X_train.to_dict(orient='record'))
# print(vec.feature_names_)
# 同样需要对测试数据数据的特征进行转换
X_test = vec.transform(X_test.to_dict(orient='record'))
# print(X_test)

# 是使用默认配置初始化决策分类器
dtc = DecisionTreeClassifier()
# 使用分割到的训练数据进行建模学习
dtc.fit(X_train, y_train)
# 用训练好的决策树模型对测试特征进行预测
y_predict = dtc.predict(X_test)
print(X_test)

# 输出预测准确性
print('使用系统自带的评估函数进行精确度评估', dtc.score(X_test, y_test))
# 输出更加详细的分类性能
print(classification_report(y_test, y_predict, target_names=['died', 'servived']))